[Advanced Bash-Scripting Guide](http://rus-linux.net/MyLDP/BOOKS/abs-guide/flat/abs-book.html)

Часть 1. Введение
## 1. Зачем необходимо знание языка Shell?
## 2. Для начала о Sha-Bang
### 2.1. Запуск сценария
### 2.2. Упражнения
Часть 2. Основы
## 3. Служебные символы
## 4. Переменные и параметры. Введение.
### 4.1. Подстановка переменных
### 4.2. Присваивание значений переменным
### 4.3. Переменные Bash не имеют типа
### 4.4. Специальные типы переменных
## 5. Кавычки
## 6. Завершение и код завершения
## 7. Проверка условий
### 7.1. Конструкции проверки условий
### 7.2. Операции проверки файлов
### 7.3. Операции сравнения
### 7.4. Вложенные условные операторы if/then
### 7.5. Проверка степени усвоения материала
## 8. Операции и смежные темы
### 8.1. Операторы
### 8.2. Числовые константы
Часть 3. Углубленный материал
## 9. К вопросу о переменных
### 9.1. Внутренние переменные
### 9.2. Работа со строками
### 9.3. Подстановка параметров
### 9.4. Объявление переменных: declare и typeset
### 9.5. Косвенные ссылки на переменные
### 9.6. $RANDOM: генерация псевдослучайных целых чисел
### 9.7. Двойные круглые скобки
## 10. Циклы и ветвления
### 10.1. Циклы
### 10.2. Вложенные циклы
### 10.3. Управление ходом выполнения цикла
### 10.4. Операторы выбора
## 11. Внутренние команды
### 11.1. Команды управления заданиями
## 12. Внешние команды, программы и утилиты
### 12.1. Базовые команды
### 12.2. Более сложные команды
### 12.3. Команды для работы с датой и временем
### 12.4. Команды обработки текста
### 12.5. Команды для работы с файлами и архивами
### 12.6. Команды для работы с сетью
### 12.7. Команды управления терминалом
### 12.8. Команды выполнения математических операций
### 12.9. Прочие команды
## 13. Команды системного администрирования
## 14. Подстановка команд
## 15. Арифметические подстановки
## 16. Перенаправление ввода/вывода
### 16.1. С помощью команды exec
### 16.2. Перенаправление для блоков кода
### 16.3. Область применения
## 17. Встроенные документы
Часть 4. Материал повышенной сложности
## 18. Регулярные выражения
### 18.1. Краткое введение в регулярные выражения
### 18.2. Globbing -- Подстановка имен файлов
## 19. Подоболочки, или Subshells
## 20. Ограниченный режим командной оболочки
## 21. Подстановка процессов
## 22. Функции
### 22.1. Сложные функции и сложности с функциями
### 22.2. Локальные переменные
## 23. Псевдонимы
## 24. Списки команд
## 25. Массивы
## 26. Файлы
## 27. /dev и /proc
### 27.1. /dev
### 27.2. /proc
## 28. /dev/zero и /dev/null
## 29. Отладка сценариев
## 30. Необязательные параметры (ключи)
## 31. Широко распространенные ошибки
## 32. Стиль программирования
### 32.1. Неофициальные рекомендации по оформлению сценариев
## 33. Разное
### 33.1. Интерактивный и неинтерактивный режим работы
### 33.2. Сценарии-обертки
### 33.3. Операции сравнения: Альтернативные решения
### 33.4. Рекурсия
### 33.5. "Цветные" сценарии
### 33.6. Оптимизация
### 33.7. Разные советы
### 33.8. Проблемы безопасности
### 33.9. Проблемы переносимости
### 33.10. Сценарии командной оболочки под Windows
## 34. Bash, версия 2
## 35. Замечания и дополнения
### 35.1. От автора
### 35.2. Об авторе
### 35.3. Инструменты, использовавшиеся при создании книги
### 35.3.1. Аппаратура
### 35.3.2. Программное обеспечение
### 35.4. Благодарности
## Литература
### A. Дополнительные примеры сценариев
### B. Маленький учебник по Sed и Awk
### B.1. Sed
### B.2. Awk
### C. Коды завершения, имеющие предопределенный смысл
### D. Подробное введение в операции ввода-вывода и перенаправление ввода-вывода
### E. Локализация
### F. История команд
### G. Пример файла .bashrc
### H. Преобразование пакетных (*.bat) файлов DOS в сценарии командной оболочки
### I. Упражнения
### I.1. Анализ сценариев
### I.2. Создание сценариев
### J. Авторские права
## Перечень таблиц
### 11-1. Идентификация заданий
### 30-1. Ключи Bash
### 33-1. Числовые значения цвета в escape-последовательностях
### B-1. Основные операции sed
### B-2. Примеры операций в sed
### C-1. "Зарезервированные" коды завершения
### H-1. Ключевые слова/переменные/операторы пакетных файлов DOS и их аналоги командной оболочки
### H-2. Команды DOS и их эквиваленты в UNIX
## Перечень приложений
### 2-1. cleanup: Сценарий очистки лог-файлов в /var/log
### 2-2. cleanup: Расширенная версия предыдущего сценария.
### 3-1. Вложенные блоки и перенаправление ввода-вывода
### 3-2. Сохранение результата исполнения вложенного блока в файл
### 3-3. Запуск цикла в фоновом режиме
### 3-4. Резервное архивирование всех файлов, которые были изменены в течение последних суток
### 4-1. Присваивание значений переменным и подстановка значений переменных
### 4-2. Простое присваивание
### 4-3. Присваивание значений переменным простое и замаскированное
### 4-4. Целое число или строка?
### 4-5. Позиционные параметры
### 4-6. wh, whois выяснение имени домена
### 4-7. Использование команды shift
### 5-1. Вывод "причудливых" переменных
### 5-2. Экранированные символы
### 6-1. завершение / код завершения
### 6-2. Использование символа ! для логической инверсии кода возврата
### 7-1. Что есть "истина"?
### 7-2. Эквиваленты команды test -- /usr/bin/test, [ ], и /usr/bin/[
### 7-3. Арифметические выражения внутри (( ))
### 7-4. Проверка "битых" ссылок
### 7-5. Операции сравнения
### 7-6. Проверка -- является ли строка пустой
### 7-7. zmost
### 8-1. Наибольший общий делитель
### 8-2. Арифметические операции
### 8-3. Построение сложных условий, использующих && и ||
### 8-4. Различные представления числовых констант
### 9-1. $IFS и пробельные символы
### 9-2. Ограничения времени ожидания ввода
### 9-3. Еще один пример ограничения времени ожидания ввода от пользователя
### 9-4. Ограничение времени ожидания команды read
### 9-5. Я -- root?
### 9-6. arglist: Вывод списка аргументов с помощью переменных $* и $@
### 9-7. Противоречия в переменных $* и $@
### 9-8. Содержимое $* и $@, когда переменная $IFS -- пуста
### 9-9. Переменная "подчеркивание"
### 9-10. Вставка пустых строк между параграфами в текстовом файле
### 9-11. Преобразование графических файлов из одного формата в другой, с изменением имени файла
### 9-12. Альтернативный способ извлечения подстрок
### 9-13. Подстановка параметров и сообщения об ошибках
### 9-14. Подстановка параметров и сообщение о "порядке использования"
### 9-15. Длина переменной
### 9-16. Поиск по шаблону в подстановке параметров
### 9-17. Изменение расширений в именах файлов:
### 9-18. Поиск по шаблону при анализе произвольных строк
### 9-19. Поиск префиксов и суффиксов с заменой по шаблону
### 9-20. Объявление переменных с помощью инструкции declare
### 9-21. Косвенные ссылки
### 9-22. Передача косвенных ссылок в awk
### 9-23. Генерация случайных чисел
### 9-24. Выбор случайной карты из колоды
### 9-25. Имитация бросания кубика с помощью RANDOM
### 9-26. Переустановка RANDOM
### 9-27. Получение псевдослучайных чисел с помощью awk
### 9-28. Работа с переменными в стиле языка C
### 10-1. Простой цикл for
### 10-2. Цикл for с двумя параметрами в каждом из элементов списка
### 10-3. Fileinfo: обработка списка файлов, находящегося в переменной
### 10-4. Обработка списка файлов в цикле for
### 10-5. Цикл for без списка аргументов
### 10-6. Создание списка аргументов в цикле for с помощью операции подстановки команд
### 10-7. grep для бинарных файлов
### 10-8. Список всех пользователей системы
### 10-9. Проверка авторства всех бинарных файлов в текущем каталоге
### 10-10. Список символических ссылок в каталоге
### 10-11. Список символических ссылок в каталоге, сохраняемый в файле
### 10-12. C-подобный синтаксис оператора цикла for
### 10-13. Работа с командой efax в пакетном режиме
### 10-14. Простой цикл while
### 10-15. Другой пример цикла while
### 10-16. Цикл while с несколькими условиями
### 10-17. C-подобный синтаксис оформления цикла while
### 10-18. Цикл until
### 10-19. Вложенный цикл
### 10-20. Команды break и continue в цикле
### 10-21. Прерывание многоуровневых циклов
### 10-22. Передача управление в начало внешнего цикла
### 10-23. Живой пример использования "continue N"
### 10-24. Использование case
### 10-25. Создание меню с помощью case
### 10-26. Оператор case допускает использовать подстановку команд вместо анализируемой переменной
### 10-27. Простой пример сравнения строк
### 10-28. Проверка ввода
### 10-29. Создание меню с помощью select
### 10-30. Создание меню с помощью select в функции
### 11-1. printf в действии
### 11-2. Ввод значений переменных с помощью read
### 11-3. Пример использования команды read без указания переменной для ввода
### 11-4. Ввод многострочного текста с помощью read
### 11-5. Обнаружение нажатия на курсорные клавиши
### 11-6. Чтение командой read из файла через перенаправление
### 11-7. Смена текущего каталога
### 11-8. Команда let, арифметические операции.
### 11-9. Демонстрация команды eval
### 11-10. Принудительное завершение сеанса
### 11-11. Шифрование по алгоритму "rot13"
### 11-12. Замена имени переменной на ее значение, в исходном тексте программы на языке Perl, с помощью eval
### 11-13. Установка значений аргументов с помощью команды set
### 11-14. Изменение значений позиционных параметров (аргументов)
### 11-15. "Сброс" переменной
### 11-16. Передача переменных во вложенный сценарий awk, с помощью export
### 11-17. Прием опций/аргументов, передаваемых сценарию, с помощью getopts
### 11-18. "Подключение" внешнего файла
### 11-19. Пример (бесполезный) сценария, который подключает себя самого.
### 11-20. Команда exec
### 11-21. Сценарий, который запускает себя самого
### 11-22. Ожидание завершения процесса перед тем как продолжить работу
### 11-23. Сценарий, завершающий себя сам с помощью команды kill
### 12-1. Создание оглавления диска для записи CDR, с помощью команды ls
### 12-2. Badname, удаление файлов в текущем каталоге, имена которых содержат недопустимые символы и пробелы.
### 12-3. Удаление файла по его номеру inode
### 12-4. Использование команды xargs для мониторинга системного журнала
### 12-5. copydir, копирование файлов из текущего каталога в другое место, с помощью xargs
### 12-6. Пример работы с expr
### 12-7. Команда date
### 12-8. Частота встречаемости отдельных слов
### 12-9. Какие из файлов являются сценариями?
### 12-10. Генератор 10-значных случайных чисел
### 12-11. Мониторинг системного журнала с помощью tail
### 12-12. Сценарий-эмулятор "grep"
### 12-13. Поиск слов в словаре
### 12-14. toupper: Преобразование символов в верхний регистр.
### 12-15. lowercase: Изменение имен всех файлов в текущем каталоге в нижний регистр.
### 12-16. du: Преобразование текстового файла из формата DOS в формат UNIX.
### 12-17. rot13: Сверхслабое шифрование по алгоритму rot13.
### 12-18. Более "сложный" шифр
### 12-19. Отформатированный список файлов.
### 12-20. Пример форматирования списка файлов в каталоге
### 12-21. nl: Самонумерующийся сценарий.
### 12-22. Пример перемещения дерева каталогов с помощью cpio
### 12-23. Распаковка архива rpm
### 12-24. Удаление комментариев из файла с текстом программы на языке C
### 12-25. Исследование каталога /usr/X11R6/bin
### 12-26. "Расширенная" команда strings
### 12-27. Пример сравнения двух файлов с помощью cmp.
### 12-28. Утилиты basename и dirname
### 12-29. Проверка целостности файла
### 12-30. Декодирование файлов
### 12-31. Сценарий, отправляющий себя самого по электронной почте
### 12-32. Ежемесячные выплаты по займу
### 12-33. Перевод чисел из одной системы счисления в другую
### 12-34. Пример взаимодействия bc со "встроенным документом"
### 12-35. Вычисление числа "пи"
### 12-36. Преобразование чисел из десятичной в шестнадцатиричную систему счисления
### 12-37. Разложение числа на простые множители
### 12-38. Расчет гипотенузы прямоугольного треугольника
### 12-39. Использование seq для генерации списка аргументов цикла for
### 12-40. Использование getopt для разбора аргументов командной строки
### 12-41. Захват нажатых клавиш
### 12-42. Надежное удаление файла
### 12-43. Генератор имен файлов
### 12-44. Преобразование метров в мили
### 12-45. Пример работы с m4
### 13-1. Установка символа "забоя"
### 13-2. невидимый пароль: Отключение эхо-вывода на терминал
### 13-3.
### 13-4. Использование команды pidof при остановке процесса
### 13-5. Проверка образа CD
### 13-6. Создание файловой системы в обычном файле
### 13-7. Добавление нового жесткого диска
### 13-8. Сценарий killall, из каталога /etc/rc.d/init.d
### 14-1. Глупая выходка
### 14-2. Запись результатов выполнения цикла в переменную
### 16-1. Перенаправление stdin с помощью exec
### 16-2. Перенаправление stdout с помощью exec
### 16-3. Одновременное перенаправление устройств, stdin и stdout, с помощью команды exec
### 16-4. Перенаправление в цикл while
### 16-5. Альтернативная форма перенаправления в цикле while
### 16-6. Перенаправление в цикл until
### 16-7. Перенаправление в цикл for
### 16-8. Перенаправление устройств (stdin и stdout) в цикле for
### 16-9. Перенаправление в конструкции if/then
### 16-10. Файл с именами "names.data", для примеров выше
### 16-11. Регистрация событий
### 17-1. dummyfile: Создание 2-х строчного файла-заготовки
### 17-2. broadcast: Передача сообщения всем, работающим в системе, пользователям
### 17-3. Вывод многострочных сообщений с помощью cat
### 17-4. Вывод многострочных сообщений с подавлением символов табуляции
### 17-5. Встроенные документы и подстановка параметров
### 17-6. Отключение подстановки параметров
### 17-7. Передача пары файлов во входящий каталог на "Sunsite"
### 17-8. Встроенные документы и функции
### 17-9. "Анонимный" Встроенный Документ
### 17-10. Блочный комментарий
### 17-11. Встроенная справка к сценарию
### 19-1. Область видимости переменных
### 19-2. Личные настройки пользователей
### 19-3. Запуск нескольких процессов в подоболочках
### 20-1. Запуск сценария в ограниченном режиме
### 22-1. Простая функция
### 22-2. Функция с аргументами
### 22-3. Наибольшее из двух чисел
### 22-4. Преобразование чисел в римскую форму записи
### 22-5. Проверка возможности возврата функциями больших значений
### 22-6. Сравнение двух больших целых чисел
### 22-7. Настоящее имя пользователя
### 22-8. Область видимости локальных переменных
### 22-9. Использование локальных переменных при рекурсии
### 23-1. Псевдонимы в сценарии
### 23-2. unalias: Объявление и удаление псевдонимов
### 24-1. Проверка аргументов командной строки с помощью "И-списка"
### 24-2. Еще один пример проверки аргументов с помощью "И-списков"
### 24-3. Комбинирование "ИЛИ-списков" и "И-списков"
### 25-1. Простой массив
### 25-2. Форматирование стихотворения
### 25-3. Некоторые специфичные особенности массивов
### 25-4. Пустые массивы и пустые элементы
### 25-5. Копирование и конкатенация массивов
### 25-6. Старая, добрая: "Пузырьковая" сортировка
### 25-7. Вложенные массивы и косвенные ссылки
### 25-8. Пример реализации алгоритма Решето Эратосфена
### 25-9. Эмуляция структуры "СТЕК" ("первый вошел -- последний вышел")
### 25-10. Исследование математических последовательностей
### 25-11. Эмуляция массива с двумя измерениями
### 27-1. Поиск файла программы по идентификатору процесса
### 27-2. Проверка состояния соединения
### 28-1. Удаление cookie-файлов
### 28-2. Создание файла подкачки (swapfile), с помощью /dev/zero
### 28-3. Создание электронного диска
### 29-1. Сценарий, содержащий ошибку
### 29-2. Пропущено ключевое слово
### 29-3. test24
### 29-4. Проверка условия с помощью функции "assert"
### 29-5. Ловушка на выходе
### 29-6. Удаление временного файла при нажатии на Control-C
### 29-7. Трассировка переменной
### 31-1. Западня в подоболочке
### 31-2. Передача вывода от команды echo команде read, по конвейеру
### 33-1. сценарий-обертка
### 33-2. Более сложный пример сценария-обертки
### 33-3. Сценарий-обертка вокруг сценария awk
### 33-4. Сценарий на языке Perl, встроенный в Bash-скрипт
### 33-5. Комбинирование сценария Bash и Perl в одном файле
### 33-6. Сценарий (бесполезный), который вызывает себя сам
### 33-7. Сценарий имеющий практическую ценность), который вызывает себя сам
### 33-8. "Цветная" адресная книга
### 33-9. Вывод цветного текста
### 33-10. Необычный способ передачи возвращаемого значения
### 33-11. Необычный способ получения нескольких возвращаемых значений
### 33-12. Передача массива в функцию и возврат массива из функции
### 33-13. Игры с анаграммами
### 34-1. Расширение строк
### 34-2. Косвенные ссылки на переменные -- новый метод
### 34-3. Простая база данных, с применением косвенных ссылок
### 34-4. Массивы и другие хитрости для раздачи колоды карт в четыре руки
### A-1. manview: Просмотр страниц руководств man
### A-2. mailformat: Форматирование электронных писем
### A-3. rn: Очень простая утилита для переименования файлов
### A-4. blank-rename: переименование файлов, чьи имена содержат пробелы
### A-5. encryptedpw: Передача файла на ftp-сервер, с использованием пароля
### A-6. copy-cd: Копирование компакт-дисков с данными
### A-7. Последовательности Коллаца (Collatz)
### A-8. days-between: Подсчет числа дней между двумя датами
### A-9. Создание "словаря"
### A-10. Расчет индекса "созвучности"
### A-11. "Игра "Жизнь""
### A-12. Файл с первым поколением для игры "Жизнь"
### A-13. behead: Удаление заголовков из электронных писем и новостей
### A-14. ftpget: Скачивание файлов по ftp
### A-15. Указание на авторские права
### A-16. password: Генератор случайного 8-ми символьного пароля
### A-17. fifo: Создание резервных копий с помощью именованных каналов
### A-18. Генерация простых чисел, с использованием оператора деления по модулю (остаток от деления)
### A-19. tree: Вывод дерева каталогов
### A-20. Функции для работы со строками
### A-21. Directory information
### A-22. Объектно ориентированная база данных
### G-1. Пример файла .bashrc
### H-1. VIEWDATA.BAT: пакетный файл DOS
### H-2. viewdata.sh: Результат преобразования VIEWDATA.BAT в сценарий командной оболочки
